package com.code.stack;

import java.util.Stack;

/**
 * 224.基本计算器
 *
 * 给你一个字符串表达式 s ，请你实现一个基本计算器来计算并返回它的值。
 * leetcode官方标准：计算出加减运算
 * 注意:不允许使用任何将字符串作为数学表达式计算的内置函数，比如 eval() 。
 */
class Solution_224 {


    public int calculate(String s) {
        Stack<Integer> stack = new Stack<>();
        int operand = 0;
        int result = 0;
        int sign = 1;

        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);

            if (Character.isDigit(ch)) {
                operand = 10 * operand + (int) (ch - '0');
            } else if (ch == '+') {
                result += sign * operand;
                sign = 1;
                operand = 0;
            } else if (ch == '-') {
                result += sign * operand;
                sign = -1;
                operand = 0;
            } else if (ch == '(') {
                // 将结果推送到堆栈并签名，供以后使用
                // 我们先推送结果，然后签名
                stack.push(result);
                stack.push(sign);

                // 重置括号中值的符号和结果
                sign = 1;
                result = 0;
            } else if (ch == ')') {
                // 添加操作数中剩余的任何内容
                result += sign * operand;

                // 操作数完成，是时候进行符号运算了
                result *= stack.pop(); // 这是括号前的符号

                // 然后将括号前的操作数加到结果中
                result += stack.pop(); // 将结果重置为括号前的那个结果

                // 重置操作数
                operand = 0;
            }
        }
        return result + (sign * operand);
    }
}